<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>12_class</title>
</head>
<body>
</body>
<!--
1. 通过class定义类/实现类的继承
2. 在类中通过constructor定义构造方法
3. 通过new来创建类的实例
4. 通过extends来实现类的继承
5. 通过super调用父类的构造方法
6. 重写从父类中继承的一般方法
-->
<script type="text/javascript">
// ---------------------- 之前的继承通过原型链来实现 ----------------------
//父类
function Super(name,age){
	this.name = name
	this.age = age
}

//父类的原型对象的方法(类似于java的静态方法)
Super.prototype.showSpuer = function(){
	console.log("Super.showSpuer ... ")
}

//子类
function Sub(name,age,price){
	/*this.name = name
	this.age = age*/
	Super.call(this,name,age) // 为了得到属性(类似Java的反射将Super方法绑定到Sub上),绑定父类的构造方法到子类
	this.price = price	
}

Sub.prototype = new Super() // 指定 Sub的原型对象为 Super的对象 
Sub.prototype.constructor = Sub // 修正构造函数为Sub本身的构造函数

// 子类的原型对象的方法
Sub.prototype.showSub = function(){
	console.log("Sub.showSub ... ")
}

var sub = new Sub("Bob",15,130000)
console.log(sub)
sub.showSub()

console.log("-------------- 华丽的分割线 ----------------")

// ---------------------- class关键字 ---------------------- 
// 新的语法的继承实际上就是原型链的语法糖，底层还是使用的原型链
// 严格按照 ES6 的语法格式书写
class Person{
	constructor(name,age){//类的构造器
		this.name = name;
		this.age = age;
	}
	
	show(){
		console.log("父类 show():",this.name,this.age);
	}
	
}

let p = new Person("lisa",13);
console.log(p)
p.show();


class Man extends Person {
	constructor(name,age,salary){
		super(name,age);//必须在这里初始化父类
		this.salary = salary;
	}
	
	//重写父类的方法
	show(){
		console.log("子类 show():",this.name,this.age,this.salary);
	}
}

let man = new Man("bart",15,16000)
console.log(man)
man.show()

</script>
</html>